{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modSGrid;

interface

uses
  Grids, BaseGrid, AdvGrid, SysUtils, ESBDates,
  Classes,
  sFonctionsChaines,
  modBaseDeDonnesRapport,
  modRapport,
  modGalaxiePlanetes,
  modStatsPlayers,
  modProfilsForAttack,
  modActionManager,
  modSondageList,
  modPlayerFinal,
  modApercuMsg,
  modFlotteEnVoyage,

  modListeAttaqueCollection,
  modListeAttaqueVaisseauxInfos,

  modBaseType, Graphics, modPlanete, modGIDtoSTR;

  // http://www.tmssoftware.com/advgrid2.htm

  

  //
  // Fonctions utiles
  //

  procedure msgInitDistanceColor;
  procedure msgColorizeRecycleur(Cellule: TCellProperties; Valeur: single);
  function msgGetColorFromDureeRecentIsBad(iDiff: int64): TColor;

  function msgGetColorFromGID(Gid: integer): TColor;


  function msgGetStatsClassement(p: PPlayerStats): string;

  function msgSpiderGalaxieTextPlaneteToLocation(sText: string): TPlanetLocation;




  //
  // Fonctions de mise à jour d'éléments
  //

  // Page apercu (messages) (non utilisé)
  procedure msgUpdateMsgListApercuRow(Row: integer; Data: PAppMessage; Grille: TAdvStringGrid);


  
  // Empire
  procedure msgUpdateEmpirePlanetColonne(Grille: TAdvStringGrid; c: integer; Planete: TPlaneteInfo; GidtoStr: TCollectionGIDtoSTR);


  // Informations sur un Element, prix, durée, etc
  procedure msgUpdateElementGIDRow(Grille: TAdvStringGrid; Element: TOGItemCost; CurrRes: TOGRessourceAll; r: integer);

  // Informations sur la production de ressource d'un Element (page Ressources)
  procedure msgUpdateRessourcesProdListRow(Grille: TAdvStringGrid; Element: TOGResUsed; CurrRes: TOGRessourceAll; i: integer);

  // Information sur la liste d'action simple (version simplifiée de la liste d'action)
  procedure msgUpdateSimpleActionScriptRow(Grille: TAdvStringGrid; r: integer; Element: PElementActionItem; GidtoStr: TCollectionGIDtoSTR);




  // Sondages (date de sondage uniquement)
  // Met à jour toutes les lignes
  procedure msgUpdateSondagesDateOnly(Grille: TAdvStringGrid; Collection: TCollectionPlaneteASonder);

  // Informations sur la planète à sonder
  procedure msgUpdateDataSondageRow(Grille: TAdvStringGrid; Row: integer; Data: PPlaneteASonder; peGalaxie: PGalaxiePlanete; DataRapport: PRapportHead; Player: TPlayerFinal);


  // Stats
  procedure msgUpdateStatsRow(Grille: TAdvStringGrid; Row: integer; Data: PPlayerStatsAllX);


  // Système solaire
  procedure msgUpdateDataSystemSolaireRow(Grille: TAdvStringGrid; Row: integer; Data: PGalaxiePlanete;  peRapport: PRapportHead; Player: TPlayerFinal);

  // Rapport d'espionnage (Filtrés, Récents, Tous)
  procedure msgUpdateRapportRow(Grille: TAdvStringGrid; Row: integer; Data: PRapportHead; peGalaxie: PGalaxiePlanete; strAttackCible: string; Player: TPlayerFinal);


  // Champ de ruine
  procedure msgUpdateChampDeRuineRow(Grille: TAdvStringGrid; Row: integer; Data: PGalaxiePlanete; peRapport: PRapportHead; Player: TPlayerFinal);



  // Liste de ses propres flottes de la page Flotte
  procedure msgUpdateFlotteListRow(Grille: TAdvStringGrid; Row: integer; Data: PFlotteListEnVoyage; Player: TPlayerFinal);


  // Elements de la liste d'attaque
  procedure msgUpdateDataListeAttaque(Grille: TAdvStringGrid; Row: integer; Data: PLAItem);
  
var
   msgCurrDate: int64;

   msgDistanceColor: array[0..120] of TColor;


implementation

uses gnugettext, Windows, modCore;


procedure msgUpdateDataListeAttaque(Grille: TAdvStringGrid; Row: integer; Data: PLAItem);
var LigneBackColor: TColor;
    LigneFontColor: TColor;
    bOverrideAllColor: boolean;

    i: integer;
    pAttackInfos: PLAActionOrdreAttaquer;
begin


    LigneFontColor := clBlack;
    LigneBackColor := clWhite;
    bOverrideAllColor := false;


    pAttackInfos := nil;


    Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.Depart);
    Grille.CellProperties[0, Row].Alignment := taCenter;



    // on commence à 1 car le premier élément ne possède pas de BrushColor/FontColor
    i := 1;



    if Data.DateEffecue > 200 then begin
       // effectué
       Grille.Cells[i, Row] := 'Effectué';
    end else begin
       Grille.Cells[i, Row] := 'En attente';
    end;
    Grille.CellProperties[i, Row].Alignment  := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    


    // Départ
    Grille.Cells[i, Row] := mbtPlanetLocationToStr(Data.Depart);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    // type
    case Data.ActionOrdreType  of
        laatAttaquer: begin
             Grille.Cells[i, Row] := 'Attaque';
             pAttackInfos := Data.ActionOrdre;
        end;

        laatTransporter: Grille.Cells[i, Row] := 'Transport';
        else Grille.Cells[i, Row] := 'Erreur';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    

    // cible location
    Grille.Cells[i, Row] := mbtPlanetLocationToStr(Data.Operation.Cible);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    // vaisseaux
    Grille.Cells[i, Row] := mlaviGetStr(@Data.Vaisseaux);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    if pAttackInfos <> nil then begin

       // gt min
       Grille.Cells[i, Row] := sfcDivistionResultEnString(pAttackInfos.RessourceMin div 2, 24500, 2);
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);



       // def max
       Grille.Cells[i, Row] := IntToStr(pAttackInfos.DefenseScoreMax);
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);



       // recl max ressource
       Grille.Cells[i, Row] := sfcDivistionResultEnString(pAttackInfos.RecyclageNbRessourceMax, 20000, 2);
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);



       // sondage planète
       Grille.Cells[i, Row] := mbtPlanetLocationToStr(pAttackInfos.Sondage.Planete);
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);

       
       // sondage état
       case pAttackInfos.Sondage.Status of
           lassIdle: Grille.Cells[i, Row] := 'Idle';
           lassAttenteRapport: Grille.Cells[i, Row] := 'Rapport attente';
           else Grille.Cells[i, Row] := 'Erreur';
       end;
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);
       

    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);
       
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);

       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);


       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);

       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       Inc(i);
    end;





end;


procedure msgUpdateFlotteListRow(Grille: TAdvStringGrid; Row: integer; Data: PFlotteListEnVoyage; Player: TPlayerFinal);
var i: integer;
    LigneBackColor: TColor;
    LigneFontColor: TColor;
    iDiff, LastDate: int64;
    sVaisseaux: string;
begin

    if Data.Direction = odRetour then begin
       LigneFontColor := clBlack;
       LigneBackColor := $00FFE7CE;
       
    end else begin
       LigneFontColor := clBlack;
       LigneBackColor := clWhite;
    end;

    // Id
    i := 0;
    Grille.Cells[0, Row] := IntToStr(Data.Numero);
    Grille.CellProperties[0, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[0, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[0, Row].FontColor  := LigneFontColor;

    i := 1;


    // Arrivee quand
    // FCurrDate
    LastDate := Data.ArriveeDate + Player.DifferenceHeureLocaleHeureServeur;
    iDiff := LastDate - msgCurrDate;

    if iDiff <= 0 then begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end else begin
       Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end;

    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // Vaisseaux
    sVaisseaux := Data.Vaisseaux;
    sVaisseaux := sfcRemplace(sVaisseaux, 'Grand transporteur', 'GT');
    sVaisseaux := sfcRemplace(sVaisseaux, 'Vaisseau de bataille', 'VB');
    sVaisseaux := sfcRemplace(sVaisseaux, 'Chasseur léger', 'CL');
    Grille.Cells[i, Row] := sVaisseaux;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // Depart
    Grille.Cells[i, Row] := mbtPlanetLocationToStr(Data.Depart);
    Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);


    // Ordre
    Grille.Cells[i, Row] := mamOrdreToStr(Data.Mission);
    Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // Direction
    Grille.Cells[i, Row] := mamDirectionToStr(Data.Direction);
    Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // Arrivee
    Grille.Cells[i, Row] := mbtPlanetLocationToStr(Data.Arrivee);
    Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



end;




procedure msgUpdateChampDeRuineRow(Grille: TAdvStringGrid; Row: integer; Data: PGalaxiePlanete; peRapport: PRapportHead; Player: TPlayerFinal);
var i: integer;
    iDiff, LastDate: int64;
    TotalRessource: integer;
    PourcentGT : single;

    LigneBackColor: TColor;
    LigneFontColor: TColor;

    peStats: PPlayerStats;
    bIsAllianceAlliees: boolean;
    bIsPlaneteVide: boolean;
begin

    LigneFontColor := clBlack;
    LigneBackColor := clWhite;

    bIsPlaneteVide := Data.Joueur = '';


    if bIsPlaneteVide = false then begin
       // A mettre par ordre de priorités


       if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_MODE_VACANCES, Data.Flags) then begin
          LigneBackColor := clSilver;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, Data.Flags) then begin
          LigneBackColor := $00FFE1F0;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, Data.Flags) then begin
          LigneBackColor := $00FFE7CE;



       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFORT, Data.Flags) then begin
          LigneBackColor := $00C6E8FF;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFAIBLE, Data.Flags) then begin
          LigneBackColor := $00C1FFE0;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_USER_BLOQUE, Data.Flags) then begin
          // pas de couleur spéciale


       end;

    end;


    peStats := Player.StatsPlayer.Get_Pointeur(Data.Joueur);


    // Obtient le pointeur de rapport
    //peRapport := FBase2DonneesRapports.Get_Pointeur(Data.Location);


    if Player.Conf.AlliancesAlliees.IndexOf(Data.Alliance) >= 0 then
       bIsAllianceAlliees := true
    else
       bIsAllianceAlliees := false;

    if Data.Lune.Surface > 0 then begin
       Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.Location) + '*';
    end else
       Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.Location);
    Grille.CellProperties[0, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[0, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[0, Row].FontColor  := LigneFontColor;



    i := 1;



    // Validité
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;

    iDiff := msgCurrDate - Data.Date;
    if iDiff < 2 then
       Grille.Cells[i, Row] := _('1 sec.')
    else
       Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, false, 3);

    if iDiff < 3600 then
       // moins d'une heure, on vient donc de le sonder
       Grille.CellProperties[i, Row].BrushColor := $00FFE9D2
    else if iDiff < 86400 then
       // Moins d'un jour et plus d'une heure
       Grille.CellProperties[i, Row].BrushColor := $00C6C6FF
    else if iDiff < 259200 then
       // Moins de trois jour, et plus d'un jour
       Grille.CellProperties[i, Row].BrushColor := $00E1E1FF
    else
       // plus de trois jour, couleur verte
       Grille.CellProperties[i, Row].BrushColor := $00D7FFD7;

    Inc(i);




    // Joueur
    Grille.Cells[i, Row] := Data.Joueur + gpGetFlagsStrToUseWithParentheseIfExist(Data.Flags);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    // Alliance (TODO: Rajouter la moyenne de point par membre entre parenthèse)
    Grille.Cells[i, Row] := Data.Alliance;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if bIsAllianceAlliees then begin
       Grille.CellProperties[i, Row].FontColor  := clBlue;
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
    end else
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];
    Inc(i);



    // metal
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ruines.Metal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // cristal
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ruines.Cristal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);


    TotalRessource := (Data.Ruines.Metal + Data.Ruines.Cristal);
    PourcentGT := TotalRessource / 20000;
    Grille.Cells[i, Row] := sfcDivistionResultEnString(TotalRessource, 20000, 2);
    msgColorizeRecycleur(Grille.CellProperties[i, Row], PourcentGT);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);

end;



procedure msgUpdateStatsRow(Grille: TAdvStringGrid; Row: integer; Data: PPlayerStatsAllX);
const COLOR_GLOBAL = clBlue;
      COLOR_FLOTTES = $000000B9;
      COLOR_RECHERCHE = clGreen;
var i: integer;
begin

    Grille.Cells[0, Row] := Data.Nom;
    Grille.CellProperties[0, Row].Alignment := taCenter;


    i := 1;


    // Place - Nombre de points du joueur
    if Data.Total.Place > 0 then begin
       Grille.Cells[i, Row] := IntToStr(Data.Total.Place);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_GLOBAL;
    Inc(i);


    // Nombre de points du joueur
    if Data.Total.Points > 0 then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Total.Points);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_GLOBAL;
    Inc(i);



    // Place - Nombre de points de flottes du joueur
    if Data.Flottes.Place > 0 then begin
       Grille.Cells[i, Row] := IntToStr(Data.Flottes.Place);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_FLOTTES;
    Inc(i);


    // Nombre de points de flottes du joueur
    if Data.Flottes.Points > 0 then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Flottes.Points);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_FLOTTES;
    Inc(i);




    // Place - Nombre de points de recherche du joueur
    if Data.Recherche.Place > 0 then begin
       Grille.Cells[i, Row] := IntToStr(Data.Recherche.Place);
       Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_RECHERCHE;
    Inc(i);

    // Nombre de points de recherche du joueur
    if Data.Recherche.Points > 0 then begin
      Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Recherche.Points);
      Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].Alignment := Classes.taCenter;
    end;
    Grille.CellProperties[i, Row].FontColor  := COLOR_RECHERCHE;
    Inc(i);


    
end;


function msgSpiderGalaxieTextPlaneteToLocation(sText: string): TPlanetLocation;
var xPos: integer;
begin
    Result.Galaxie := -1;

    xPos := LastDelimiter('-', sText);
    if xPos <= 0 then exit;

    System.Delete(sText, 1, xPos + 1);

    sText := trim(sText);

    Result := mpcExtractPlanetLocation(sText);

    if Result.Position < 1 then
       Result.Galaxie := -1;

end;

procedure msgUpdateRapportRow(Grille: TAdvStringGrid; Row: integer; Data: PRapportHead; peGalaxie: PGalaxiePlanete; strAttackCible: string; Player: TPlayerFinal);
const
   COLOR_RESSOURCE_PROTEGER = clSilver;         // Calculer par le pc
   COLOR_RESSOURCE_PROTEGER_USER = $006A6A6A;   // Définit par l'utilisateur

   COLOR_NEVER_ATTACK = $00A00000;

var i, j: integer;
    iDiff, LastDate: int64;
    TotalRessource: integer;
    PourcentGT : single;

    LigneBackColor: TColor;
    LigneFontColor: TColor;
    bOverrideAllColor, bDontChangeColor: boolean;


    peStats: PPlayerStats;
    bIsAllianceAllieeExp: boolean;
    GT_CAN_TRANSPORTER : integer;
    pDepart: TPlanetLocation;
begin




    LigneFontColor := clBlack;
    LigneBackColor := clWhite;
    bOverrideAllColor := false;
    bDontChangeColor  := false;

    if NoT(scFlotte in Data.SectionConnu) then begin
       // Les flottes ne sont pas connues
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;

    end else if Data.NbFlotte >= Player.Conf.LimitQtFlottes  then begin
       // Flottes connues, mais trop nombreuse
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;


    end else if NoT(scDefense in Data.SectionConnu) then begin
       // Les défenses ne sont pas connu
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;


    end else if Data.DefenseScore >= Player.Conf.LimitQtDefense  then begin
       // Défenses connues, mais trop nombreuse
       LigneFontColor := clBlack;
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;
    end;





    if sfcFlagsIsIn(FLAG_NE_JAMAIS_ATTACK, Data.Flags) then begin
       // On ne doit pas l'attaquer
       LigneBackColor := COLOR_NEVER_ATTACK;
       LigneFontColor := clYellow;
       bOverrideAllColor := true;
    end;

    if sfcFlagsIsIn(FLAG_TROP_BIEN_DEF, Data.Flags) then begin
       // Trop bien défendu
       LigneBackColor := COLOR_RESSOURCE_PROTEGER_USER;

    end;



    bIsAllianceAllieeExp := false;

    if peGalaxie <> nil then begin

         if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_MODE_VACANCES, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFAIBLE, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFORT, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PLANETE_NON_OCCUPEE, peGalaxie.Flags))or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then begin


             LigneBackColor := clBlack;
             LigneFontColor := clYellow;
             bOverrideAllColor := true;

         end else if Player.Conf.IsAllianceAlliees(peGalaxie.Alliance) then begin
             LigneBackColor := clBlue;
             LigneFontColor := clWhite;
             bOverrideAllColor := true;
             bDontChangeColor := true;
             bIsAllianceAllieeExp := true;

         end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, peGalaxie.Flags) then begin
             LigneBackColor := $00FFE1F0;
             LigneFontColor := clBlack;
             //bOverrideAllColor := true;

         end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, peGalaxie.Flags) then begin
             LigneBackColor := $00FFE7CE;
             LigneFontColor := clBlack;
             //bOverrideAllColor := true;

         end;


    end;


    if bIsAllianceAllieeExp = false then begin
       if (sfcFlagsIsIn(FLAG_MODE_TROP_PEUDEV, Data.Flags)) and (bDontChangeColor = false) then begin
          // Pas assez devellopé
          LigneBackColor := $00FFF2FF;
          LigneFontColor := clGreen;
          bOverrideAllColor := true;
       end;

       if sfcFlagsIsIn(FLAG_DEJA_RECYCLER, Data.Flags) then begin
          // Déjà recycler
          LigneBackColor := $00FF0080;
          LigneFontColor := $0080FF80;
          bOverrideAllColor := true;
       end;
       if sfcFlagsIsIn(FLAG_A_RECYCLER, Data.Flags) then begin
          // A recycler (prioritaire sur la couleur déjà recycler)
          LigneBackColor := $0092DBFE;
          LigneFontColor := $00004080;
          bOverrideAllColor := true;
       end;
    end;


    LastDate := mrGetMostRecentDate(Data.DateLastAttaque);
    iDiff := msgCurrDate - LastDate;

    if (LastDate > 0) and (iDiff < 7200) then
       // On vient juste de l'attaquer
       LigneBackColor := clTeal;



    Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.PlaneteLocation);
    Grille.CellProperties[0, Row].Alignment := taCenter;


    i := 1;

    // pourcentage ESP
    Grille.Cells[i, Row] := IntToStr(Data.PourcentContreEspion) + '%';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if mbtIsLune(Data.PlaneteLocation) then begin
       Grille.CellProperties[i, Row].BrushColor := $00B8478B;
       Grille.CellProperties[i, Row].FontColor  := $00BFD5FF;
    end;
    Inc(i);

    //Grille.Cells[1, Row] := 'Classement';
    //Grille.CellProperties[1, Row].Alignment := taRightJustify;



    // Nombre de fois que cette planète a été sondé
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbEspionnage);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;

    if sfcFlagsIsIn(FLAG_NIV_ESP_ELEVE, Data.Flags) then begin
       // On ne doit pas l'attaquer
       Grille.CellProperties[i, Row].BrushColor := $00FCE1FF;

    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);




    // Nombre de fois que cette planète a été attaqué
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbAttack);
    if Data.NbAttack > 0 then begin
       Grille.CellProperties[i, Row].BrushColor := $00D5E2FF;
       Grille.CellProperties[i, Row].FontColor  := clBlack;
    end else begin
       Grille.CellProperties[i, Row].FontColor  := clSilver;
    end;

    if sfcFlagsIsIn(FLAG_POULE_AUX_OEUFS_DOR, Data.Flags) then begin
       Grille.CellProperties[i, Row].BrushColor := clYellow;
       Grille.CellProperties[i, Row].FontColor  := clGreen;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);




    // Date de sondage
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    LastDate := mrGetMostRecentDate(Data.DateLastEspionnage);
    iDiff := msgCurrDate - LastDate;

    if iDiff < 2 then
       Grille.Cells[i, Row] := _('1 sec.')
    else
       Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true, 3);

    Grille.CellProperties[i, Row].BrushColor := msgGetColorFromDureeRecentIsBad(iDiff);

    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;

    // Vérifie si un sondage est planifié vers cette planète
    if Player.SondagePlanetesList.Get_Pointeur(Data.PlaneteLocation) <> nil then begin
       Grille.Cells[i, Row] := Grille.Cells[i, Row]  + ' **';
    end;

    Inc(i);



    // Date de dernière attaque
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    LastDate := mrGetMostRecentDate(Data.DateLastAttaque);
    if LastDate < 500 then begin
       Grille.Cells[i, Row] := '---';
    end else begin
       iDiff := msgCurrDate - LastDate;

       if iDiff < 2 then
          Grille.Cells[i, Row] := _('1 sec.')
       else
          Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true, 3);

       Grille.CellProperties[i, Row].BrushColor := msgGetColorFromDureeRecentIsBad(iDiff);
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);




    ////////////
    // Nombre de GT pour récupérer toute les ressources possible
    TotalRessource := Data.Ressource.Metal + Data.Ressource.Cristal + Data.Ressource.Deuterium;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;


    // On ne peut prendre au maximum la moitié des ressources
    if Player.Conf.VersionPT then begin
       GT_CAN_TRANSPORTER := 4950;
    end else begin
       GT_CAN_TRANSPORTER := 24500;
    end;



    PourcentGT := (TotalRessource div 2) / GT_CAN_TRANSPORTER;
    Grille.Cells[i, Row] := sfcDivistionResultEnString(TotalRessource div 2, GT_CAN_TRANSPORTER, 2); // on prevoit 500 pour le transport de carburant
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].FontColor  := clBlack;

    if PourcentGT < 0.6 then begin
       Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;
       Grille.CellProperties[i, Row].FontColor  := clSilver;

    end else if PourcentGT < 1.4 then begin
       // de 0.5 à 1.3  donc 1 GT
       // inutile d'attaquer
       //Grille.CellProperties[i, Row].BrushColor := $00FFF5EC;
       Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;

    end else if PourcentGT < 2.4 then begin
       // de 1.3 à 2.4 donc 2 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFE9D5;

    end else if PourcentGT < 3.4 then begin
       // de 2.4 à 3.4 donc 3 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFD6B0;

    end else if PourcentGT < 4.4 then begin
       // de 3.4 à 4.4 donc 4 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFC28C;

    end else if PourcentGT < 6.4 then begin
       // de 4.4 à 6.4 donc 5 ou 6 GT
       Grille.CellProperties[i, Row].BrushColor := $00C4E0FB;


    end else begin
       Grille.CellProperties[i, Row].BrushColor := $00AFBBFA;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);


    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Metal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Cristal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Deuterium);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    if Player.Conf.GrilleDesactiveColonneDef = false then begin
       // Nombre de défense
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       if scDefense in Data.SectionConnu then begin
          Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbDefense);

          if Data.NbDefense = 0 then
             Grille.CellProperties[i, Row].FontColor  := clSilver;

       end else begin
          Grille.Cells[i, Row] := _('Unk');
          Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
       end;
       if bOverrideAllColor then begin
          Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
          Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       end;
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Inc(i);
    end;


    // Evaluation de la defense
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scDefense in Data.SectionConnu then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.DefenseScore);

       if Data.DefenseScore < 1 then begin
          Grille.CellProperties[i, Row].FontColor  := clSilver;
          Grille.CellProperties[i, Row].BrushColor := $00FBFEE2;
       end;

    end else begin
       Grille.Cells[i, Row] := _('Unk');
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);





    // Nombre de flotte
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scFlotte in Data.SectionConnu then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbFlotte);

       if Data.NbFlotte = 0 then
          Grille.CellProperties[i, Row].FontColor  := clSilver;


    end else begin
       Grille.Cells[i, Row] := _('Unk');
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);


    // Nombre de recycleur
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scFlotte in Data.SectionConnu then begin
       if Data.RecyclageNbRessource > 0 then begin
          PourcentGT := Data.RecyclageNbRessource / 20000;
          Grille.Cells[i, Row] := sfcDivistionResultEnString(Data.RecyclageNbRessource, 20000, 2);


          msgColorizeRecycleur(Grille.CellProperties[i, Row], PourcentGT);



       end else begin
          Grille.Cells[i, Row] := '0';
          Grille.CellProperties[i, Row].FontColor  := clSilver;
       end;

    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);




    // Joueur
    peStats := nil;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peGalaxie <> nil then begin
       if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then
          Grille.Cells[i, Row] := _('** Vide **')
       else begin
          Grille.Cells[i, Row] := peGalaxie.Joueur + gpGetFlagsStrToUseWithParentheseIfExist(peGalaxie.Flags);

          peStats := Player.StatsPlayer.Get_Pointeur(peGalaxie.Joueur);
       end;

    end else begin
       Grille.Cells[i, Row] := '---';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);



    // Points
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peStats <> nil then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(peStats.Points);

    end else begin
       Grille.Cells[i, Row] := '';
    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    Inc(i);


    


    // Alliance
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peGalaxie <> nil then begin
       if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then
          Grille.Cells[i, Row] := '-'
       else begin
          Grille.Cells[i, Row] := peGalaxie.Alliance;
       end;


    end else begin
       Grille.Cells[i, Row] := '---';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);



    // Distance de la planète attaquante
    // FDistanceColor

    if trim(strAttackCible) <> '' then begin
       pDepart := msgSpiderGalaxieTextPlaneteToLocation(strAttackCible);
       Grille.CellProperties[i, Row].FontColor  := clBlack;

       j := Abs(pDepart.SystemSolaire - Data.PlaneteLocation.SystemSolaire);
       if j < 0 then
          j := 0;
       if j > 100 then
          j := 100;

       Grille.CellProperties[i, Row].BrushColor := msgDistanceColor[j];
       Grille.Cells[i, Row] := IntToStr(j);
       Grille.CellProperties[i, Row].Alignment := taCenter;

    end else begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);



end;


procedure msgUpdateDataSystemSolaireRow(Grille: TAdvStringGrid; Row: integer; Data: PGalaxiePlanete;  peRapport: PRapportHead; Player: TPlayerFinal);
var i: integer;
    iDiff, LastDate: int64;
    TotalRessource: integer;
    PourcentGT : single;

    LigneBackColor: TColor;
    LigneFontColor: TColor;

    peStats: PPlayerStats;
    bIsAllianceAlliees: boolean;
    bIsPlaneteVide: boolean;
begin


    LigneFontColor := clBlack;
    LigneBackColor := clWhite;

    bIsPlaneteVide := Data.Joueur = '';


    if bIsPlaneteVide = false then begin
       // A mettre par ordre de priorités


       if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_MODE_VACANCES, Data.Flags) then begin
          LigneBackColor := clSilver;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, Data.Flags) then begin
          LigneBackColor := $00FFE1F0;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, Data.Flags) then begin
          LigneBackColor := $00FFE7CE;



       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFORT, Data.Flags) then begin
          LigneBackColor := $00C6E8FF;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFAIBLE, Data.Flags) then begin
          LigneBackColor := $00C1FFE0;

       end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_USER_BLOQUE, Data.Flags) then begin
          // pas de couleur spéciale


       end;

    end;


    peStats := Player.StatsPlayer.Get_Pointeur(Data.Joueur);


    // Obtient le pointeur de rapport
    //peRapport := FBase2DonneesRapports.Get_Pointeur(Data.Location);


    if Player.Conf.AlliancesAlliees.IndexOf(Data.Alliance) >= 0 then
       bIsAllianceAlliees := true
    else
       bIsAllianceAlliees := false;



    if Data.Lune.Surface > 0 then begin
       Grille.Cells[0, Row] := IntToStr(Data.Location.Position) + '*';
    end else
       Grille.Cells[0, Row] := IntToStr(Data.Location.Position);
    Grille.CellProperties[0, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[0, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[0, Row].FontColor  := LigneFontColor;



    i := 1;

    // Joueur
    Grille.Cells[i, Row] := Data.Joueur + gpGetFlagsStrToUseWithParentheseIfExist(Data.Flags);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    // Nombre de points du Joueur
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];

    if peStats = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else begin
          Grille.Cells[i, Row] := 'Non classé';
          Grille.CellProperties[i, Row].FontColor := clGreen;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end;
       
    end else begin
       Grille.Cells[i, Row] := msgGetStatsClassement(peStats);


       if peStats.Points > Player.Conf.LimitStGlobal then begin
          Grille.CellProperties[i, Row].FontColor := clRed;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];

       end else if bIsAllianceAlliees then begin
          // Plus faible mais alliance alliées
          Grille.CellProperties[i, Row].FontColor := clGreen;
       end;
    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;

    Inc(i);


    // Nombre de points de flotte (classement entre parenthèse)
    peStats := Player.StatsPlayerFlottes.Get_Pointeur(Data.Joueur);
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];

    if peStats = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else begin
          Grille.Cells[i, Row] := _('Non classé');
          Grille.CellProperties[i, Row].FontColor := clGreen;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end;

    end else begin
       Grille.Cells[i, Row] := msgGetStatsClassement(peStats);

       if peStats.Points > Player.Conf.LimitStFlotte  then begin
          Grille.CellProperties[i, Row].FontColor := clRed;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end else if bIsAllianceAlliees then begin
          // Plus faible mais alliance alliées
          Grille.CellProperties[i, Row].FontColor := clGreen;
       end;

    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;

    Inc(i);


    // Alliance (TODO: Rajouté la moyenne de point par membre entre parenthèse)
    Grille.Cells[i, Row] := Data.Alliance;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if bIsAllianceAlliees then begin
       Grille.CellProperties[i, Row].FontColor  := clBlue;
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
    end else
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];
    Inc(i);



    // Dernier sondage
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;

    if peRapport = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else
          Grille.Cells[i, Row] := _('Jamais');

    end else begin
       LastDate := mrGetMostRecentDate(peRapport.DateLastEspionnage);
       iDiff := msgCurrDate - LastDate;

       if iDiff < 2 then
          Grille.Cells[i, Row] := _('1 sec.')
       else
          Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, false, 3);


       if iDiff < 3600 then
          // moins d'une heure, on vient donc de le sonder
          Grille.CellProperties[i, Row].BrushColor := $00FFE9D2
       else if iDiff < 86400 then
          // Moins d'un jour et plus d'une heure
          Grille.CellProperties[i, Row].BrushColor := $00C6C6FF
       else if iDiff < 259200 then
          // Moins de trois jour, et plus d'un jour
          Grille.CellProperties[i, Row].BrushColor := $00E1E1FF
       else
          // plus de trois jour, couleur verte
          Grille.CellProperties[i, Row].BrushColor := $00D7FFD7;

    end;
    Inc(i);


    // Derniere attaque
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;

    if peRapport = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else
          Grille.Cells[i, Row] := _('Jamais');

    end else begin
       // ATTENTION: Contrairement au sondage, si le rapport existe il n'est pas
       // obligatoire que la planète fut attaquer
       LastDate := mrGetMostRecentDate(peRapport.DateLastAttaque);
       if LastDate < 500 then begin
          Grille.Cells[i, Row] := _('Jamais');

       end else begin
          iDiff := msgCurrDate - LastDate;

          if iDiff < 2 then
             Grille.Cells[i, Row] := _('1 sec.')
          else
             Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, false, 3);


          if iDiff < 3600 then
             // moins d'une heure, on vient donc de le sonder
             Grille.CellProperties[i, Row].BrushColor := $00FFE9D2
          else if iDiff < 86400 then
             // Moins d'un jour et plus d'une heure
             Grille.CellProperties[i, Row].BrushColor := $00C6C6FF
          else if iDiff < 259200 then
             // Moins de trois jour, et plus d'un jour
             Grille.CellProperties[i, Row].BrushColor := $00E1E1FF
          else
             // plus de trois jour, couleur verte
             Grille.CellProperties[i, Row].BrushColor := $00D7FFD7;

       end;

    end;
    Inc(i);


    if peRapport <> nil then
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(peRapport.Ressource.Metal)
    else
       Grille.Cells[i, Row] := '-';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Inc(i);

    if peRapport <> nil then
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(peRapport.Ressource.Cristal)
    else
       Grille.Cells[i, Row] := '-';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Inc(i);


    if peRapport <> nil then
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(peRapport.Ressource.Deuterium)
    else
       Grille.Cells[i, Row] := '-';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Inc(i);






    // Défenses
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    if peRapport <> nil then begin

          if scDefense in peRapport.SectionConnu then begin
             Grille.Cells[i, Row] := sfcFormatStrToMilliers(peRapport.NbDefense);

             if peRapport.NbDefense = 0 then
                Grille.CellProperties[i, Row].FontColor  := clSilver;

             Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;
          end else begin
             Grille.Cells[i, Row] := _('Unk');
             Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
          end;

    end else begin
        Grille.Cells[i, Row] := '-';
    end;
    Inc(i);



    // Flottes
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    if peRapport <> nil then begin

          if scFlotte in peRapport.SectionConnu then begin
             Grille.Cells[i, Row] := sfcFormatStrToMilliers(peRapport.NbFlotte);

             if peRapport.NbFlotte = 0 then
                Grille.CellProperties[i, Row].FontColor  := clSilver;

             Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;
          end else begin
             Grille.Cells[i, Row] := _('Unk');
             Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
          end;

    end else begin
        Grille.Cells[i, Row] := '-';
    end;
    Inc(i);



    // Validité
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;

    iDiff := msgCurrDate - Data.Date;
    if iDiff < 2 then
       Grille.Cells[i, Row] := _('1 sec.')
    else
       Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, false, 3);

    if iDiff < 3600 then
       // moins d'une heure, on vient donc de le sonder
       Grille.CellProperties[i, Row].BrushColor := $00FFE9D2
    else if iDiff < 86400 then
       // Moins d'un jour et plus d'une heure
       Grille.CellProperties[i, Row].BrushColor := $00C6C6FF
    else if iDiff < 259200 then
       // Moins de trois jour, et plus d'un jour
       Grille.CellProperties[i, Row].BrushColor := $00E1E1FF
    else
       // plus de trois jour, couleur verte
       Grille.CellProperties[i, Row].BrushColor := $00D7FFD7;

    Inc(i);


    
end;




procedure msgUpdateMsgListApercuRow(Row: integer; Data: PAppMessage; Grille: TAdvStringGrid);
var i: integer;
    LigneBackColor: TColor;
    LigneFontColor: TColor;
    iDiff, LastDate: int64;
    sVaisseaux: string;
begin


    LigneFontColor := clBlack;
    LigneBackColor := clWhite;

    // Départ
    Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.Depart);
    Grille.CellProperties[0, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[0, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[0, Row].FontColor  := LigneFontColor;
    if Data.bColorMenace then begin
       Grille.CellProperties[0, Row].BrushColor := clRed;
       Grille.CellProperties[0, Row].FontColor  := clYellow;
    end;
    i := 1;

    // Arrivee
    Grille.Cells[i, Row] := mbtPlanetLocationToStr(Data.Arrivee);
    Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    // Ordre
    Grille.Cells[i, Row] := mamOrdreToStr(Data.Ordre);
    Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);


    // Vaisseaux
    sVaisseaux := Data.VaisseauxStr;
    sVaisseaux := sfcRemplace(sVaisseaux, 'Grand transporteur', 'GT');
    sVaisseaux := sfcRemplace(sVaisseaux, 'Vaisseau de bataille', 'VB');
    sVaisseaux := sfcRemplace(sVaisseaux, 'Chasseur léger', 'CL');
    Grille.Cells[i, Row] := sVaisseaux;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);


    // Message entier
    Grille.Cells[i, Row] := Data.Msg;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

end;



function msgGetStatsClassement(p: PPlayerStats): string;
begin
    Result := format(_('%s (%d em)'), [sfcFormatStrToMilliers(p.Points), p.Place]);
end;



procedure msgUpdateDataSondageRow(Grille: TAdvStringGrid; Row: integer; Data: PPlaneteASonder; peGalaxie: PGalaxiePlanete; DataRapport: PRapportHead; Player: TPlayerFinal);
var i: integer;
    LigneBackColor: TColor;
    LigneFontColor: TColor;
    iDiff, LastDate: int64;

    peStats: PPlayerStats;

    bIsPlaneteVide, bIsAllianceAlliees: boolean;


    PourcentGT: single;
begin

    LigneFontColor := clBlack;
    LigneBackColor := clWhite;

    bIsPlaneteVide     := false;
    bIsAllianceAlliees := false;


    if peGalaxie <> nil then
       peStats := Player.StatsPlayer.Get_Pointeur(peGalaxie.Joueur)
    else
       peStats := nil;




    // FCurrDate

    Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.Coord);
    Grille.CellProperties[0, Row].Alignment := Classes.taRightJustify;
    Grille.CellProperties[0, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[0, Row].FontColor  := LigneFontColor;
    i := 1;



    // Joueur
    if peGalaxie <> nil then
       Grille.Cells[i, Row] := peGalaxie.Joueur + gpGetFlagsStrToUseWithParentheseIfExist(peGalaxie.Flags)
    else
       Grille.Cells[i, Row] := '---';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);




    // Nombre de points du Joueur
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];

    if peStats = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else begin
          Grille.Cells[i, Row] := _('Non classé');
          Grille.CellProperties[i, Row].FontColor := clGreen;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end;
       
    end else begin
       Grille.Cells[i, Row] := msgGetStatsClassement(peStats);

       if peStats.Points > Player.Conf.LimitStGlobal then begin
          Grille.CellProperties[i, Row].FontColor := clRed;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end else if bIsAllianceAlliees then begin
          // Plus faible mais alliance alliées
          Grille.CellProperties[i, Row].FontColor := clGreen;
       end;
    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;

    Inc(i);

    



    // Nombre de points de flotte (classement entre parenthèse)
    if peGalaxie <> nil then
       peStats := Player.StatsPlayerFlottes.Get_Pointeur(peGalaxie.Joueur)
    else
       peStats := nil;

    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];

    if peStats = nil then begin
       if bIsPlaneteVide then
          Grille.Cells[i, Row] := ''
       else begin
          Grille.Cells[i, Row] := _('Non classé');
          Grille.CellProperties[i, Row].FontColor := clGreen;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end;

    end else begin
       //Grille.Cells[i, Row] := sfcFormatStrToMilliers(peStats.Points) + ' (' + IntToStr(peStats.Place) + 'em)';
       //Grille.Cells[i, Row] := format(_('%s (%d em)'), [sfcFormatStrToMilliers(peStats.Points), peStats.Place]);
       Grille.Cells[i, Row] := msgGetStatsClassement(peStats);


       if peStats.Points > Player.Conf.LimitStFlotte  then begin
          Grille.CellProperties[i, Row].FontColor := clRed;
          Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
       end else if bIsAllianceAlliees then begin
          // Plus faible mais alliance alliées
          Grille.CellProperties[i, Row].FontColor := clGreen;
       end;

    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taLeftJustify;

    Inc(i);




    // Alliance (TODO: Rajouter la moyenne de point par membre entre parenthèse)
    if peGalaxie <> nil then
       Grille.Cells[i, Row] := peGalaxie.Alliance
    else
       Grille.Cells[i, Row] := '---';

    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if bIsAllianceAlliees then begin
       Grille.CellProperties[i, Row].FontColor  := clBlue;
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle + [fsBold];
    end else
       Grille.CellProperties[i, Row].FontStyle := Grille.CellProperties[i, Row].FontStyle - [fsBold];
    Inc(i);




    // Nombre de sondes envoyées
    Grille.Cells[i, Row] := IntToStr(Data.NbSondes);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    if Data.NbSondes > Player.Conf.SondesNbMini then begin
       Grille.CellProperties[i, Row].BrushColor := $0092DBFE;
    end else
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);


    // Date du sondage
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;

    if Data.DateSondage < 100 then
       Grille.Cells[i, Row] := _('En attente')
    else begin
       iDiff := msgCurrDate - Data.DateSondage;

       if iDiff < 2 then
          Grille.Cells[i, Row] := _('1 sec.')
       else
          Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, false, 3);

    end;
    Inc(i);





    // Date de sondage (si déjà sondé)
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;

    if DataRapport <> nil then begin
       LastDate := mrGetMostRecentDate(DataRapport.DateLastEspionnage);
       iDiff := msgCurrDate - LastDate;

       if iDiff < 2 then
          Grille.Cells[i, Row] := _('1 sec.')
       else
          Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true, 3);

       Grille.CellProperties[i, Row].BrushColor := msgGetColorFromDureeRecentIsBad(iDiff);



    end else begin
       // jamais espionné
       Grille.Cells[i, Row] := _('Jamais');
    end;
    Inc(i);




    // Evaluation de la defense
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if DataRapport <> nil then begin
       if scDefense in DataRapport.SectionConnu then begin
          Grille.Cells[i, Row] := sfcFormatStrToMilliers(DataRapport.DefenseScore);

          if DataRapport.DefenseScore < 1 then
             Grille.CellProperties[i, Row].FontColor  := clSilver;

       end else begin
          Grille.Cells[i, Row] := _('Unk');
          Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
       end;
    end else begin
       // jamais sondé
       Grille.Cells[i, Row] := '';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);




    // Nombre de recycleur
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if DataRapport <> nil then begin
       if scFlotte in DataRapport.SectionConnu then begin
          if DataRapport.RecyclageNbRessource > 0 then begin
             PourcentGT := DataRapport.RecyclageNbRessource / 20000;
             Grille.Cells[i, Row] := sfcDivistionResultEnString(DataRapport.RecyclageNbRessource, 20000, 2);

             if PourcentGT < 3.6 then begin
                Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;
                Grille.CellProperties[i, Row].FontColor  := clSilver;

             end else if PourcentGT < 5.4 then begin
                // de 3.6 à 5.3  
                // inutile d'attaquer
                Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;

             end else if PourcentGT < 10.4 then begin
                // de 5.3 à 10.4
                Grille.CellProperties[i, Row].BrushColor := $00FFE9D5;

             end else if PourcentGT < 30.4 then begin
                // de 10.4 à 30.4
                Grille.CellProperties[i, Row].BrushColor := $00FFD6B0;

             end else if PourcentGT < 45.4 then begin
                // de 30.4 à 45.4
                Grille.CellProperties[i, Row].BrushColor := $00FFC28C;

             end else if PourcentGT < 60.4 then begin
                // de 40.4 à 6.4
                Grille.CellProperties[i, Row].BrushColor := $00C4E0FB;


             end else begin
                Grille.CellProperties[i, Row].BrushColor := $00AFBBFA;
             end;


             if PourcentGT < 1.0 then
                Grille.CellProperties[i, Row].FontColor  := clSilver;

          end else begin
             Grille.Cells[i, Row] := '0';
             Grille.CellProperties[i, Row].FontColor  := clSilver;
          end;

       end else begin
          Grille.Cells[i, Row] := '-';
          Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
       end;
    end else begin
       // jamais sondé
       Grille.Cells[i, Row] := '';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);

end;



procedure msgUpdateSondagesDateOnly(Grille: TAdvStringGrid; Collection: TCollectionPlaneteASonder);
const CNT_COLONNE_DATE_SONDAGE = 6;
var CurrInfos: PPlaneteASonder;
    i, r: integer;
    iDiff: int64;
begin


    if (Grille.RowCount <> (Collection.Count + 1)) or (Grille.RowCount < 6) then begin
       // Des éléments ont été sondé, il vaut mieux tout réactualisé
       exit;
    end;

    r := 1;
    Grille.BeginUpdate;

    msgCurrDate := DateTimeToUnix(Now);

    for i := 0 to Collection.Count - 1 do begin
        CurrInfos := Collection.Items[i];

        //UpdateDataSondage(r, CurrInfos^, Grille);

        // Met à jour que la date
        if CurrInfos.DateSondage < 10 then begin
           Grille.Cells[CNT_COLONNE_DATE_SONDAGE, r] := _('En attente');
           
        end else begin
           iDiff := msgCurrDate - CurrInfos.DateSondage;
           if iDiff < 2 then
              Grille.Cells[CNT_COLONNE_DATE_SONDAGE, r] := _('1 sec.')
           else
              Grille.Cells[CNT_COLONNE_DATE_SONDAGE, r] := ESBDGetDureeStrings(iDiff, false, 3);

        end;

        Inc(r);
    end;

    Grille.EndUpdate;


end;



procedure msgUpdateSimpleActionScriptRow(Grille: TAdvStringGrid; r: integer; Element: PElementActionItem; GidtoStr: TCollectionGIDtoSTR);
var i: integer;
    couleur: TColor;
begin

    // La ligne existe obligatoirement
    if Element.GID >= ACTION_GIDMISC_BEST_RESSOURCE_ACTIVITY_NEXTELEMENT then begin
       Grille.CellProperties[0, r].FontColor := clTeal;
       Grille.CellProperties[1, r].FontColor := clTeal;
       Grille.CellProperties[2, r].FontColor := clTeal;
       Grille.CellProperties[3, r].FontColor := clTeal;

    end else begin
       Grille.CellProperties[0, r].FontColor := clBlack;
       Grille.CellProperties[1, r].FontColor := clBlack;
       Grille.CellProperties[2, r].FontColor := clBlack;
       Grille.CellProperties[3, r].FontColor := clBlack;
    end;

    // Pour le fond maintenant
    Couleur := msgGetColorFromGID(Element.GID);

    for i := 0 to 7 do begin
       Grille.CellProperties[i, r].BrushColor := couleur;
    end;

    Grille.Cells[0, r] := GidtoStr.GetGIDStr(Element.GID);
    Grille.CellProperties[0, r].Alignment := Classes.taRightJustify;

    Grille.Cells[1, r] := mamGetStatusToStrShort(Element.Status);

    Grille.Cells[2, r] := IntToStr(Element.Quantite);
    Grille.Cells[3, r] := IntToStr(Element.NiveauRequis);


   // sgAction.Cells[4, r] := IntToStr(Element.NiveauAtteint);

end;


procedure msgUpdateRessourcesProdListRow(Grille: TAdvStringGrid; Element: TOGResUsed; CurrRes: TOGRessourceAll; i: integer);
var r: integer;
begin
    if i > 0 then begin
       Grille.AddRow;
       r := Grille.RowCount - 1;
    end else
       r := 1;

    Grille.Cells[0, r] := Element.IdOpt;

    Grille.Cells[1, r] := sfcFormatStrToMilliers(Element.prMetal);
    Grille.Cells[2, r] := sfcFormatStrToMilliers(Element.prCristal);
    Grille.Cells[3, r] := sfcFormatStrToMilliers(Element.prDeuterium);

    if Element.prEnergie > 0 then begin
       Grille.Cells[4, r] := sfcFormatStrToMilliers(Element.prEnergie);
    end else begin
       Grille.Cells[4, r] := format('%d/%d', [Element.csEnergieUsed, Element.csEnergieAllow]);
    end;

    if Element.Activite < 0 then begin
       Grille.Cells[5, r] := '';
    end else begin
       Grille.Cells[5, r] := IntToStr(Element.Activite) + '%';
    end;

    if Element.ActiviteForOptimization < 0 then begin
       Grille.Cells[6, r] := '';
    end else begin
       Grille.Cells[6, r] := IntToStr(Element.ActiviteForOptimization) + '%';
    end;




    Grille.CellProperties[0, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[1, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[2, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[3, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[4, r].Alignment := taCenter;
    Grille.CellProperties[5, r].Alignment := taCenter;

end;



procedure msgUpdateElementGIDRow(Grille: TAdvStringGrid; Element: TOGItemCost; CurrRes: TOGRessourceAll; r: integer);
var couleur, i: integer;
begin



    Grille.Cells[0, r] := Element.Nom;

    if Element.Niveau > 0 then
       Grille.Cells[1, r] := sfcFormatStrToMilliers(Element.Niveau)
    else
       Grille.Cells[1, r] := '';

    if Element.EnConstruction then begin
       Grille.Cells[1, r] := Grille.Cells[1, r] + '*';
    end;

    Element.LigneInGrid := r;


    Grille.Cells[2, r] := sfcFormatStrToMilliers(Element.Prix.Metal);
    Grille.Cells[3, r] := sfcFormatStrToMilliers(Element.Prix.Cristal);
    Grille.Cells[4, r] := sfcFormatStrToMilliers(Element.Prix.Deuterium);

    Grille.Cells[5, r] := ESBDGetDureeStrings(Element.Duree, true);

    if Element.CanBeBuildIn >= 0 then
       Grille.Cells[6, r] := ESBDGetDureeStrings(Element.CanBeBuildIn, true)
    else
       Grille.Cells[6, r] := _('Inconnu');

    if Element.CanBeBuildInOpt >= 0 then
       Grille.Cells[7, r] := ESBDGetDureeStrings(Element.CanBeBuildInOpt, true)
    else
       Grille.Cells[7, r] := _('Inconnu');

       
    Grille.CellProperties[0, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[1, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[2, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[3, r].Alignment := Classes.taRightJustify;
    Grille.CellProperties[4, r].Alignment := Classes.taRightJustify;

    // tgidRecherche, tgidVaisseau, tgidDefense

    case Element.GIDType of
         tgidBatiment :   Couleur := COLOR_DESIGN_BATIMENT;   // jaune
         tgidRecherche:  Couleur := COLOR_DESIGN_RECHERCHE;   // 00FDFFEA;  // bleu
         tgidVaisseau :  Couleur := COLOR_DESIGN_VAISSEAUX;  //00FFEAF3;  // violet
         tgidDefense  :    Couleur := COLOR_DESIGN_DEFENSE; // 00F2F2FF;   // rouge
         tgidAutre    :    Couleur := COLOR_DESIGN_RESPROD;
         else Couleur := clWhite;

     end;

    for i := 0 to 7 do begin
       Grille.CellProperties[i, r].BrushColor := couleur;
       Grille.CellProperties[i, r].FontColor  := clBlack;
    end;


    if Element.Prix.Metal > CurrRes.Metal then begin
       Grille.CellProperties[2, r].FontColor := clRed;
    end else begin
       Grille.CellProperties[2, r].FontColor := clTeal;
    end;

    if Element.Prix.Cristal > CurrRes.Cristal then begin
       Grille.CellProperties[3, r].FontColor := clRed;
    end else begin
       Grille.CellProperties[3, r].FontColor := clTeal;
    end;

    if Element.Prix.Deuterium > CurrRes.Deuterium then begin
       Grille.CellProperties[4, r].FontColor := clRed;
    end else begin
       Grille.CellProperties[4, r].FontColor := clTeal;
    end;


    if Element.GIDType = tgidAutre then begin

       for i := 0 to 7 do begin
          Grille.CellProperties[i, r].FontColor := clBlue;
       end;

    end;


end;






















procedure msgInitDistanceColor;
var i: integer;
begin
    // on augmente le rouge pour arriver au jaune
    for i := 0 to 50 do begin
        msgDistanceColor[i] := RGB((i * 5) + 1, 255, 110);
    end;

    // puis on baisse le vert pour donner du rouge // 51 to 101
    for i := 0 to 50 do begin
        msgDistanceColor[i + 51] := RGB(250, 255 - (i * 4) - 10, 81);
    end;
end;


procedure msgColorizeRecycleur(Cellule: TCellProperties; Valeur: single);
begin

          if Valeur < 3.6 then begin
             Cellule.BrushColor := $00FFFFFF;
             Cellule.FontColor  := clSilver;

          end else if Valeur < 5.4 then begin
             // de 3.6 à 5.3  
             // inutile d'attaquer
             Cellule.BrushColor := $00FFFFFF;

          end else if Valeur < 10.4 then begin
             // de 5.3 à 10.4
             Cellule.BrushColor := $00FFE9D5;

          end else if Valeur < 30.4 then begin
             // de 10.4 à 30.4
             Cellule.BrushColor := $00FFD6B0;

          end else if Valeur < 45.4 then begin
             // de 30.4 à 45.4
             Cellule.BrushColor := $00FFC28C;

          end else if Valeur < 60.4 then begin
             // de 40.4 à 6.4
             Cellule.BrushColor := $00C4E0FB;


          end else begin
             Cellule.BrushColor := $00AFBBFA;
          end;


          if Valeur < 1.0 then
             Cellule.FontColor  := clSilver;

end;

// Plus la durée est petite, plus la couleur doit signifier qu'il faut faire attention
// Plus la durée est grande, plus la couleur doit signifier qu'on est libre de faire ce que l'on veut
function msgGetColorFromDureeRecentIsBad(iDiff: int64): TColor;
begin

    if iDiff < 3600 then
       // moins d'une heure, on vient donc de le sonder
       Result := $00FFE9D2
    else if iDiff < 86400 then
       // Moins d'un jour et plus d'une heure
       Result := $00C6C6FF
    else if iDiff < 259200 then
       // Moins de trois jour, et plus d'un jour
       Result := $00E1E1FF
    else
       // plus de trois jour, couleur verte
       Result := $00D7FFD7;


end;



(*
procedure UpdateData(Row: integer; Data: PRapportHead; Grille: TAdvStringGrid; Profil: TProfilsAttack);
const
   COLOR_RESSOURCE_PROTEGER = clSilver;         // Calculer par le pc
   COLOR_RESSOURCE_PROTEGER_USER = $006A6A6A;   // Définit par l'utilisateur

   COLOR_NEVER_ATTACK = $00A00000;

var i, j: integer;
    iDiff, LastDate: int64;
    TotalRessource: integer;
    PourcentGT : single;

    LigneBackColor: TColor;
    LigneFontColor: TColor;
    bOverrideAllColor, bDontChangeColor: boolean;

    peGalaxie: PGalaxiePlanete;
    peStats: PPlayerStats;
    bIsAllianceAllieeExp: boolean;
    GT_CAN_TRANSPORTER : integer;
    pDepart: TPlanetLocation;
begin




    LigneFontColor := clBlack;
    LigneBackColor := clWhite;
    bOverrideAllColor := false;
    bDontChangeColor  := false;

    if NoT(scFlotte in Data.SectionConnu) then begin
       // Les flottes ne sont pas connues
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;

    end else if Data.NbFlotte >= Profil.LimitQtFlottes  then begin
       // Flottes connues, mais trop nombreuse
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;


    end else if NoT(scDefense in Data.SectionConnu) then begin
       // Les défenses ne sont pas connu
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;


    end else if Data.DefenseScore >= Profil.LimitQtDefense  then begin
       // Défenses connues, mais trop nombreuse
       LigneFontColor := clBlack;
       LigneBackColor := COLOR_RESSOURCE_PROTEGER;
    end;





    if sfcFlagsIsIn(FLAG_NE_JAMAIS_ATTACK, Data.Flags) then begin
       // On ne doit pas l'attaquer
       LigneBackColor := COLOR_NEVER_ATTACK;
       LigneFontColor := clYellow;
       bOverrideAllColor := true;
    end;

    if sfcFlagsIsIn(FLAG_TROP_BIEN_DEF, Data.Flags) then begin
       // Trop bien défendu
       LigneBackColor := COLOR_RESSOURCE_PROTEGER_USER;

    end;



    bIsAllianceAllieeExp := false;
    peGalaxie := FBase2DonneesPlanete.Get_Pointeur(Data.PlaneteLocation);

    if peGalaxie <> nil then begin

         if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_MODE_VACANCES, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFAIBLE, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFORT, peGalaxie.Flags)) or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_PLANETE_NON_OCCUPEE, peGalaxie.Flags))or
            (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then begin


             LigneBackColor := clBlack;
             LigneFontColor := clYellow;
             bOverrideAllColor := true;

         end else if Profil.IsAllianceAlliees(peGalaxie.Alliance) then begin
             LigneBackColor := clBlue;
             LigneFontColor := clWhite;
             bOverrideAllColor := true;
             bDontChangeColor := true;
             bIsAllianceAllieeExp := true;

         end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, peGalaxie.Flags) then begin
             LigneBackColor := $00FFE1F0;
             LigneFontColor := clBlack;
             //bOverrideAllColor := true;

         end else if sfcFlagsIsIn(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, peGalaxie.Flags) then begin
             LigneBackColor := $00FFE7CE;
             LigneFontColor := clBlack;
             //bOverrideAllColor := true;

         end;


    end;


    if bIsAllianceAllieeExp = false then begin
       if (sfcFlagsIsIn(FLAG_MODE_TROP_PEUDEV, Data.Flags)) and (bDontChangeColor = false) then begin
          // Pas assez devellopé
          LigneBackColor := $00FFF2FF;
          LigneFontColor := clGreen;
          bOverrideAllColor := true;
       end;

       if sfcFlagsIsIn(FLAG_DEJA_RECYCLER, Data.Flags) then begin
          // Déjà recycler
          LigneBackColor := $00FF0080;
          LigneFontColor := $0080FF80;
          bOverrideAllColor := true;
       end;
       if sfcFlagsIsIn(FLAG_A_RECYCLER, Data.Flags) then begin
          // A recycler (prioritaire sur la couleur déjà recycler)
          LigneBackColor := $0092DBFE;
          LigneFontColor := $00004080;
          bOverrideAllColor := true;
       end;
    end;


    LastDate := mrGetMostRecentDate(Data.DateLastAttaque);
    iDiff := msgCurrDate - LastDate;

    if iDiff < 7200 then
       // On vient juste de l'attaquer
       LigneBackColor := clTeal;



    Grille.Cells[0, Row] := mbtPlanetLocationToStr(Data.PlaneteLocation);
    Grille.CellProperties[0, Row].Alignment := taCenter;


    i := 1;

    // pourcentage ESP
    Grille.Cells[i, Row] := IntToStr(Data.PourcentContreEspion) + '%';
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if mbtIsLune(Data.PlaneteLocation) then begin
       Grille.CellProperties[i, Row].BrushColor := $00B8478B;
       Grille.CellProperties[i, Row].FontColor  := $00BFD5FF;
    end;
    Inc(i);

    //Grille.Cells[1, Row] := 'Classement';
    //Grille.CellProperties[1, Row].Alignment := taRightJustify;



    // Nombre de fois que cette planète a été sondé
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbEspionnage);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;

    if sfcFlagsIsIn(FLAG_NIV_ESP_ELEVE, Data.Flags) then begin
       // On ne doit pas l'attaquer
       Grille.CellProperties[i, Row].BrushColor := $00FCE1FF;

    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);




    // Nombre de fois que cette planète a été attaqué
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbAttack);
    if Data.NbAttack > 0 then begin
       Grille.CellProperties[i, Row].BrushColor := $00D5E2FF;
       Grille.CellProperties[i, Row].FontColor  := clBlack;
    end else begin
       Grille.CellProperties[i, Row].FontColor  := clSilver;
    end;

    if sfcFlagsIsIn(FLAG_POULE_AUX_OEUFS_DOR, Data.Flags) then begin
       Grille.CellProperties[i, Row].BrushColor := clYellow;
       Grille.CellProperties[i, Row].FontColor  := clGreen;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);




    // Date de sondage
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    LastDate := mrGetMostRecentDate(Data.DateLastEspionnage);
    iDiff := msgCurrDate - LastDate;

    if iDiff < 2 then
       Grille.Cells[i, Row] := _('1 sec.')
    else
       Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true, 3);

    Grille.CellProperties[i, Row].BrushColor := msgGetColorFromDureeRecentIsBad(iDiff);

    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    // Vérifie si un sondage est planifié vers cette planète
    //
    if FSondagePlanetesList.Get_Pointeur(Data.PlaneteLocation) <> nil then begin
       Grille.Cells[i, Row] := Grille.Cells[i, Row]  + ' **';
    end;

    Inc(i);



    // Date de dernière attaque
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    LastDate := mrGetMostRecentDate(Data.DateLastAttaque);
    if LastDate < 500 then begin
       Grille.Cells[i, Row] := '---';
    end else begin
       iDiff := msgCurrDate - LastDate;

       if iDiff < 2 then
          Grille.Cells[i, Row] := _('1 sec.')
       else
          Grille.Cells[i, Row] := ESBDGetDureeStrings(iDiff, true, 3);

       Grille.CellProperties[i, Row].BrushColor := msgGetColorFromDureeRecentIsBad(iDiff);
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);




    ////////////
    // Nombre de GT pour récupérer toute les ressources possible
    TotalRessource := Data.Ressource.Metal + Data.Ressource.Cristal + Data.Ressource.Deuterium;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;


    // On ne peut prendre au maximum la moitié des ressources
    if Profil.VersionPT then begin
       GT_CAN_TRANSPORTER := 4950;
    end else begin
       GT_CAN_TRANSPORTER := 24500;
    end;



    PourcentGT := (TotalRessource div 2) / GT_CAN_TRANSPORTER;
    Grille.Cells[i, Row] := sfcDivistionResultEnString(TotalRessource div 2, GT_CAN_TRANSPORTER, 2); // on prevoit 500 pour le transport de carburant
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].FontColor  := clBlack;

    if PourcentGT < 0.6 then begin
       Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;
       Grille.CellProperties[i, Row].FontColor  := clSilver;

    end else if PourcentGT < 1.4 then begin
       // de 0.5 à 1.3  donc 1 GT
       // inutile d'attaquer
       //Grille.CellProperties[i, Row].BrushColor := $00FFF5EC;
       Grille.CellProperties[i, Row].BrushColor := $00FFFFFF;

    end else if PourcentGT < 2.4 then begin
       // de 1.3 à 2.4 donc 2 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFE9D5;

    end else if PourcentGT < 3.4 then begin
       // de 2.4 à 3.4 donc 3 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFD6B0;

    end else if PourcentGT < 4.4 then begin
       // de 3.4 à 4.4 donc 4 GT
       Grille.CellProperties[i, Row].BrushColor := $00FFC28C;

    end else if PourcentGT < 6.4 then begin
       // de 4.4 à 6.4 donc 5 ou 6 GT
       Grille.CellProperties[i, Row].BrushColor := $00C4E0FB;


    end else begin
       Grille.CellProperties[i, Row].BrushColor := $00AFBBFA;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);


    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Metal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Cristal);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);

    Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.Ressource.Deuterium);
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    Inc(i);



    if chkDesactiveColonneDef.Checked = false then begin
       // Nombre de défense
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       if scDefense in Data.SectionConnu then begin
          Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbDefense);

          if Data.NbDefense = 0 then
             Grille.CellProperties[i, Row].FontColor  := clSilver;

       end else begin
          Grille.Cells[i, Row] := _('Unk');
          Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
       end;
       if bOverrideAllColor then begin
          Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
          Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
       end;
       Grille.CellProperties[i, Row].Alignment := taCenter;
       Inc(i);
    end;


    // Evaluation de la defense
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scDefense in Data.SectionConnu then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.DefenseScore);

       if Data.DefenseScore < 1 then begin
          Grille.CellProperties[i, Row].FontColor  := clSilver;
          Grille.CellProperties[i, Row].BrushColor := $00FBFEE2;
       end;

    end else begin
       Grille.Cells[i, Row] := _('Unk');
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);





    // Nombre de flotte
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scFlotte in Data.SectionConnu then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(Data.NbFlotte);

       if Data.NbFlotte = 0 then
          Grille.CellProperties[i, Row].FontColor  := clSilver;


    end else begin
       Grille.Cells[i, Row] := _('Unk');
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);


    // Nombre de recycleur
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if scFlotte in Data.SectionConnu then begin
       if Data.RecyclageNbRessource > 0 then begin
          PourcentGT := Data.RecyclageNbRessource / 20000;
          Grille.Cells[i, Row] := sfcDivistionResultEnString(Data.RecyclageNbRessource, 20000, 2);


          msgColorizeRecycleur(Grille.CellProperties[i, Row], PourcentGT);



       end else begin
          Grille.Cells[i, Row] := '0';
          Grille.CellProperties[i, Row].FontColor  := clSilver;
       end;

    end else begin
       Grille.Cells[i, Row] := '-';
       Grille.CellProperties[i, Row].BrushColor := $00D2E9FF;
    end;
    if bOverrideAllColor then begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);




    // Joueur
    peStats := nil;
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peGalaxie <> nil then begin
       if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then
          Grille.Cells[i, Row] := _('** Vide **')
       else begin
          Grille.Cells[i, Row] := peGalaxie.Joueur + gpGetFlagsStrToUseWithParentheseIfExist(peGalaxie.Flags);

          peStats := FCurrentPlayer.StatsPlayer.Get_Pointeur(peGalaxie.Joueur);
       end;

    end else begin
       Grille.Cells[i, Row] := '---';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);



    // Points
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peStats <> nil then begin
       Grille.Cells[i, Row] := sfcFormatStrToMilliers(peStats.Points);

    end else begin
       Grille.Cells[i, Row] := '';
    end;
    Grille.CellProperties[i, Row].Alignment := Classes.taRightJustify;
    Inc(i);




    // Alliance
    Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
    Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    if peGalaxie <> nil then begin
       if (sfcFlagsIsIn(CNT_GALAXIE_FLAGS_ASTEROIDES, peGalaxie.Flags)) then
          Grille.Cells[i, Row] := '-'
       else begin
          Grille.Cells[i, Row] := peGalaxie.Alliance;
       end;


    end else begin
       Grille.Cells[i, Row] := '---';
    end;
    Grille.CellProperties[i, Row].Alignment := taCenter;
    Inc(i);



    // Distance de la planète attaquante
    // FDistanceColor

    if trim(cbAttaquePlanete.Text) <> '' then begin
       pDepart := SpiderGalaxieTextPlaneteToLocation(cbAttaquePlanete.Text);
       Grille.CellProperties[i, Row].FontColor  := clBlack;

       j := Abs(pDepart.SystemSolaire - Data.PlaneteLocation.SystemSolaire);
       if j < 0 then
          j := 0;
       if j > 100 then
          j := 100;

       Grille.CellProperties[i, Row].BrushColor := FDistanceColor[j];
       Grille.Cells[i, Row] := IntToStr(j);
       Grille.CellProperties[i, Row].Alignment := taCenter;

    end else begin
       Grille.CellProperties[i, Row].BrushColor := LigneBackColor;
       Grille.CellProperties[i, Row].FontColor  := LigneFontColor;
    end;
    Inc(i);



end;
*)






function msgGetColorFromGID(Gid: integer): TColor;
begin

    // Pour le fond maintenant
    if GID < 100 then begin
       // de 1 à 99: Batiment
       Result := COLOR_DESIGN_BATIMENT;

    end else if GID < 200 then begin
       // de 100 à 199: Recherche
       Result := COLOR_DESIGN_RECHERCHE;

    end else if GID < 300 then begin
       //de 200 à 299: Vaisseaux
       Result := COLOR_DESIGN_VAISSEAUX;

    end else if GID < 510 then begin
       // de 400 à 499: Defense
       Result := COLOR_DESIGN_DEFENSE;

    end else
       Result := clWhite;

end;



(*******************************************************************************
 Affiche une planète dans le tableau de l'empire
 C'est la ligne qui varie, et la COLONNE reste fixe
*******************************************************************************)
procedure msgUpdateEmpirePlanetColonne(Grille: TAdvStringGrid; c: integer; Planete: TPlaneteInfo; GidtoStr: TCollectionGIDtoSTR);
var i , j, k:integer;
    CurrDate, cDiff: int64;
    cProd: TOGRessourceAll;
    peGIDToStr: PGIDtoSTR;

    pItemGID : POGItemCost;

    Couleur: TColor;
begin

    CurrDate := DateTimeToUnix(Now);

    Grille.Cells[c, 0] := Planete.FNom;
    Grille.CellProperties[c, 0].Alignment := taCenter;
    Grille.ColWidths[c] := 79;


    i := 1;

    Grille.Cells[c, i] := Planete.pLocationStr;
    Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

    Grille.Cells[c, i] := format(_('%d sur %d'), [Planete.FNbCasesOccupees, Planete.FNbCasesTotales]);
    Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);


    Grille.Cells[c, i] := '';
    Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);
    
    Grille.Cells[c, i] := '';
    Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);


    Grille.Cells[c, i] := IntToStr(Planete.cActions.GetActionsRestanteAExecuter);
    Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);


    if Planete.FLastRessourcesDate > 100 then begin

       Grille.Cells[c, i] := sfcFormatStrToMilliers(Planete.FLastRessources.Metal);
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

       Grille.Cells[c, i] := sfcFormatStrToMilliers(Planete.FLastRessources.Cristal);
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

       Grille.Cells[c, i] := sfcFormatStrToMilliers(Planete.FLastRessources.Deuterium);
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

       Grille.Cells[c, i] := IntToStr(Planete.FLastRessources.Energie);
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify;  Inc(i);

       cDiff := CurrDate - Planete.FLastRessourcesDate;

       if cDiff > 0 then begin
       //   if cDiff < 3600 then begin
       //      Grille.Cells[c, i] := ESBDGetDureeStrings(cDiff, true);
       //   end else begin
             Grille.Cells[c, i] := ESBDGetDureeStrings(cDiff, true, 200);
       //   end;

          Grille.CellProperties[c, i].Alignment := Classes.taRightJustify;  Inc(i);

       end else begin
          Grille.Cells[c, i] := _('Invalide');
          Grille.CellProperties[c, i].Alignment := taCenter;  Inc(i);
       end;


    end else begin
       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].Alignment := taCenter;  Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].Alignment := taCenter;  Inc(i);

    end;


    Couleur := COLOR_DESIGN_RESPROD;

    if Planete.cRessources.Count > 0 then begin
       cProd := Planete.cRessources.GetProdParHeure;

       Grille.Cells[c, i] := sfcFormatStrToMilliers(cProd.Metal);
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

       Grille.Cells[c, i] := sfcFormatStrToMilliers(cProd.Cristal);
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

       Grille.Cells[c, i] := sfcFormatStrToMilliers(cProd.Deuterium);
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := Classes.taRightJustify; Inc(i);

    end else begin


       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);

       Grille.Cells[c, i] := _('Inconnu');
       Grille.CellProperties[c, i].BrushColor := Couleur;
       Grille.CellProperties[c, i].Alignment := taCenter; Inc(i);


    end;

    // bien que la recherche ne peut se faire que sur une seule planète, et est
    // partagée de partout, on place quand même dans le tableau les éléments
    // pour pouvoir connaitre sur quelle planète telle recherche est disponible
    // cependant, réduire cela sous forme d'option pour ne pas remplir le tableau
    // inutilement

    if GidtoStr.Count > 0 then begin

       for j := 0 to GidtoStr.Count - 1 do begin
          peGIDToStr := GidtoStr.Items[j];


          if mbtIsValidGID(peGIDToStr.GID) then begin
             k := Planete.cElements.GetNiveauOfThisGID(peGIDToStr.Gid);

             if k < 0 then begin
                Grille.Cells[c, i] := '-';
                Grille.CellProperties[c, i].FontColor := clBlack;

             end else begin
                if Planete.cElements.GetIfThisGIDIsInConstruction(peGIDToStr.GID) then begin
                   Grille.Cells[c, i] := '*' + IntToStr(k);
                   Grille.CellProperties[c, i].FontColor := clBlack;
                   
                end else begin
                   // Affiche le niveau
                   Grille.Cells[c, i] := IntToStr(k);

                   // Et définit la couleur de la police si on peut faire passer au niveau
                   // suivant
                   pItemGID := Planete.cElements.GetGidItem(peGIDToStr.GID);
                   if (pItemGID.Prix.Metal <= Planete.FLastRessources.Metal) and
                      (pItemGID.Prix.Cristal <= Planete.FLastRessources.Cristal) and
                      (pItemGID.Prix.Deuterium <= Planete.FLastRessources.Deuterium) then begin

                      Grille.CellProperties[c, i].FontColor := clGreen;
                   end else begin
                      Grille.CellProperties[c, i].FontColor := clRed;
                      

                   end;

                end;
             end;

             Grille.CellProperties[c, i].BrushColor := msgGetColorFromGID(peGIDToStr.Gid);
             Grille.CellProperties[c, i].Alignment := taCenter;
             Inc(i);

          end;
          
       end;

    end;


  //
    // FGidToStr

    
end;

end.
